class Solution {


    /**
     * 寻找旋转排列数组中的最小值 53题
     * @param nums
     * @return
     */
    public int findMin(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        while (left < right){
            int mid = left + (right - left) / 2;
            if(nums[mid] > nums[nums.length - 1]) left = mid + 1;
            else right = mid;
        }
        return nums[left];
    }

    /**
     * 峰值元素是指其值严格大于左右相邻值的元素 第162题
     * @param nums
     * @return
     */
    public int findPeakElement(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        while (left < right){
            int mid = left + (right - left) / 2;
            if(nums[mid] > nums[mid + 1]) right = mid;
            else if (nums[mid] < nums[mid + 1]) left = mid + 1;
        }
        return left;
    }


    /**
     * 给定一个长度为 n 的整数 山脉 数组 arr ，其中的值递增到一个 峰值元素 然后递减。 852题
     * @param arr
     * @return
     */
    public int peakIndexInMountainArray(int[] arr) {
        int left = 0;
        int right = arr.length - 1;
        while (left <  right){
            int mid = left + (right - left + 1) / 2;
            if(arr[mid] > arr[mid - 1]) left = mid;
            else if(arr[mid] < arr[mid - 1])right = mid - 1;
        }
        return left;
    }
}